package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

//2.创建一个模型
//字段名称首字母大写
type User struct {
	gorm.Model //自动加上id ctime utime dtime
	Id int
	Name string
	Age int
	Addr string

}
//使用TableName重写表名称
func (User)TableName()string{
	return "test_gorm_table_name"
}

func main() {
	//1.创建数据库连接
	//连接数据库 用户名:密码@tcp(ip:port)/数据库名称?charset=utf8&parseTime=True&loc=Local
	db, err := gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/db01?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}

	//3.创建表 不指定表明模型后面会+s
	db.CreateTable(&User{})	//users
	//4.指定表名创建表
	db.Table("user").CreateTable(&User{}) //user

	//5.删除表
	db.DropTable("user")	//删掉表名称为users的表 删除了user
	db.DropTable(&User{})	//按结构体老删除表 删除了users

	//6.检查表是否存在
	HasUser:=db.HasTable("user")
	fmt.Println(HasUser)	//true false
	HasUsers:=db.HasTable(&User{})
	fmt.Println(HasUsers)	//true false


	//统一给所有表加前缀后缀
	gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
		return "sys_"+defaultTableName+"_sys"
	}

	//7.自动迁移数据表
	//自动迁移表仅仅是创建表，添加且少列和索引，并且不会改变现有列的类型，保护现有的数据
	db.AutoMigrate(&User{})	//可以传多个模型

	//8.增加
	db.Create(&User{Name: "张三",Age:18,Addr: "北京市朝阳区"})
	db.Create(&User{Name: "李四",Age:18,Addr: "北京市海淀区"})
	db.Create(&User{Name: "王五",Age:18,Addr: "北京市顺义区"})

	//9.查询
	//9.1查询第一条
	var user User
	//db.First(&user,1)	//默认根据id
	db.First(&user,"name=?","李四")//指定根据name去查询
	fmt.Println(user)

	////10.修改
	//var user User
	//db.First(&user,1)
	//db.Model(&user).Update("age",100)
	//fmt.Println(user)
	//
	////11.删除
	//var user User
	//db.First(&user,2)	//删除第二条数据
	//db.Delete(&user)

	defer db.Close()	//关闭空闲的连接

}
